﻿using System;
using System.Diagnostics;
using System.IO;

namespace Ahresty
{
    internal class StlmixmessherHandler
    {
        /// <summary>
        /// 指定の情報でADSTEFANの「stlmixmessher.exe」を実行する
        /// </summary>
        /// <param name="workDir">ワークフォルダ（実行フォルダ）</param>
        /// <param name="outlineFilePath">ADSTEFANのstlmixmessher.exeファイルのパス</param>
        /// <param name="inputFileRelativePath">入力ファイルの相対パス</param>
        internal static string ExecuteStlmixmessher(string workDir, string stlmixmessherFilePath, string inputFileRelativePath)
        {
            string inputFilePath = Path.Combine(workDir, inputFileRelativePath);

            string[] contents = File.ReadAllLines(inputFilePath);
            int stlCount = int.Parse(contents[0]);

            //記述された入力データファイルのパスが存在しなければ作成する
            string dirPath = workDir;
            string[] dirNames = contents[1 + 3 * stlCount].Split('\\');
            for (int n = 0; n < dirNames.Length - 1; n++)
            {
                dirPath = Path.Combine(dirPath, dirNames[n]);
                if (!Directory.Exists(dirPath))
                    Directory.CreateDirectory(dirPath);
            }

            //記述された外形線データファイルのパスが存在しなければ作成する
            for (int m = 2; m <= 4; m++)//XY・YZ・ZXでフォルダを三回チェック
            {
                dirPath = workDir;
                dirNames = contents[m + 3 * stlCount].Split('\\');
                for (int n = 0; n < dirNames.Length - 1; n++)
                {
                    dirPath = Path.Combine(dirPath, dirNames[n]);
                    if (!Directory.Exists(dirPath))
                        Directory.CreateDirectory(dirPath);
                }
            }

            ProcessStartInfo s = new ProcessStartInfo();
            s.WorkingDirectory = workDir;
            s.FileName = stlmixmessherFilePath;
            s.Arguments = String.Format(" {0}", inputFileRelativePath);
            s.UseShellExecute = false;
            s.CreateNoWindow = true;

            Process p = Process.Start(s);
            p.WaitForExit();

            string in3dFilePath = Path.Combine(workDir, contents[1 + 3 * stlCount]);
            return File.Exists(in3dFilePath) ? in3dFilePath : String.Empty;
        }

        /// <summary>
        /// 指定の情報でADSTEFANの「outline.exe」を実行する
        /// </summary>
        /// <param name="workDir">ワークフォルダ（実行フォルダ）</param>
        /// <param name="stlmixmessherFilePath">ADSTEFANのoutline.exeファイルのパス</param>
        /// <param name="inputFileRelativePath">入力ファイルの相対パス</param>
        internal static void ExecuteOutline(string workDir, string outlineFilePath, string inputFileRelativePath)
        {
            ProcessStartInfo s = new ProcessStartInfo();
            s.WorkingDirectory = workDir;
            s.FileName = outlineFilePath;
            s.Arguments = String.Format(" {0}", inputFileRelativePath);
            s.UseShellExecute = false;
            s.CreateNoWindow = true;

            Process p = Process.Start(s);
            p.WaitForExit();
        }
    }
}
